/**
 * Copyright 2013, Haruki Hasegawa
 * <p>
 * Licensed under the MIT license:
 * http://creativecommons.org/licenses/MIT/
 * <p>
 * from http://stackoverflow.com/questions/2641111/where-is-os-systemproperties
 * <p>
 * from http://stackoverflow.com/questions/2641111/where-is-os-systemproperties
 * <p>
 * from http://stackoverflow.com/questions/2641111/where-is-os-systemproperties
 */

/**
 * from http://stackoverflow.com/questions/2641111/where-is-os-systemproperties
 */

package com.pheelicks.app.utils;

import ohos.app.Context;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

import java.lang.reflect.Method;

public class SystemPropertiesProxy {
    private static HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x000001, "SystemPropertiesProxy");

    /**
     * Get the value for the given key, returned as a boolean. Values 'n', 'no',
     * '0', 'false' or 'off' are considered false. Values 'y', 'yes', '1', 'true'
     * or 'on' are considered true. (case insensitive). If the key does not exist,
     * or has any other value, then the default result is returned.
     *
     * @param context context
     * @param key the key to lookup
     * @param def a default value to return
     * @return the key parsed as a boolean, or def if the key isn't found or is
     *         not able to be parsed as a boolean.
     * @throws IllegalArgumentException if the key exceeds 32 characters
     */
    public static Boolean getBoolean(Context context, String key, boolean def)
        throws IllegalArgumentException {
        return getBoolean(context.getClassloader(), key, def);
    }

    public static Boolean getBoolean(ClassLoader cl, String key, boolean def)
        throws IllegalArgumentException {
        Boolean ret = def;

        try {
            @SuppressWarnings("rawtypes")
            Class SystemProperties = cl.loadClass("ohos.os.SystemProperties");

            // Parameters Types
            @SuppressWarnings("rawtypes")
            Class[] paramTypes = new Class[2];
            paramTypes[0] = String.class;
            paramTypes[1] = boolean.class;

            @SuppressWarnings("unchecked")
            Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes);

            // Parameters
            Object[] params = new Object[2];
            params[0] = key;
            params[1] = Boolean.valueOf(def);

            ret = (Boolean) getBoolean.invoke(SystemProperties, params);
        } catch (IllegalArgumentException iAE) {
            throw iAE;
        } catch (Exception e) {
            HiLog.error(label, "getBoolean(context, key: " + key + ", def:" + def + ")" + e);
            ret = def;
        }

        return ret;
    }
}
